/**
 * @param {number} capacity
 */
var LRUCache = function (capacity) {
    this.capacity = capacity;
    this.map = new Map();
    this.obj = {}
    this.stack = []
};

/** 
 * @param {number} key
 * @return {number}
 */
LRUCache.prototype.get = function (key) {
    let res = this.map.get(key);
    if (res === undefined) {
        return -1;
    } else {
        let index = this.stack.indexOf(key);
        if (index === 1) {
            this.stack.pop();
            this.stack.unshift(key);
        }
        return res;
    }
};

/** 
 * @param {number} key 
 * @param {number} value
 * @return {void}
 */
// LRUCache.prototype.put = function (key, value) {
//     if (this.capacity > 0) {
//         this.map.set(key, value);
//         // this.obj[key] = 0;
//         this.stack.push(key,value)
//         this.capacity--;
//     } else {
//         // const keys = Object.keys(this.obj);
//         // console.log(this.obj[keys[0]], this.obj[keys[1]]);
//         // console.log(keys);
//         // this.map.forEach((v, k) => {
//         //     console.log(`Key: ${k}, Value: ${v}`);
//         // });
//         // if (this.obj[keys[0]] > this.obj[keys[1]]) {
//         //     console.log(this.obj);
//         //     this.map.delete(Number(keys[1]));
//         //     delete this.obj[keys[1]];
//         //     this.map.set(key, value);
//         //     this.obj[key] = 0;
//         //     this.map.forEach((valu, ke) => {
//         //         console.log(`Key: ${ke}, Value: ${valu}`);
//         //     });
//         // } else {
//         //     this.map.delete(Number(keys[0]));
//         //     delete this.obj[keys[0]];
//         //     this.map.set(key, value);
//         //     this.obj[key] = 0;
//         // }

//     }

// };

LRUCache.prototype.put = function (key, value) {
    if (this.capacity > 0) {
        this.map.set(key, value);
        this.stack.unshift(key)
        this.capacity--;
    } else {
        let index = this.stack.indexOf(key);
        if (index === -1) {
            let pop = this.stack.pop();
            this.stack.unshift(key);
            this.map.delete(pop);
            this.map.set(key, value)
        } else {
            let shift = 0;
            if (index === 0) {
                shift = this.stack.shift();
            } else {
                shift = this.stack.pop()
            }
            this.stack.unshift(key);
            this.map.delete(shift);
            this.map.set(key, value)
        }
    }

};
const lRUCache = new LRUCache(2);
// [[2],[2,1],[1,1],[2,3],[4,1],[1],[2]]
// [[2],[2],[2,6],[1],[1,5],[1,2],[1],[2]]
console.log(lRUCache.get(2));
lRUCache.put(2, 6);
console.log(lRUCache.get(1));
console.log(lRUCache.stack);
lRUCache.put(1, 5);

lRUCache.map.forEach((v, k) => {
    console.log(`Key: ${k}, Value: ${v}`);
});
console.log(lRUCache.stack);

lRUCache.put(1, 2);

console.log(lRUCache.get(1));
lRUCache.map.forEach((v, k) => {
    console.log(`Key: ${k}, Value: ${v}`);
});
console.log(lRUCache.stack);

console.log(lRUCache.get(2));


// console.log(lRUCache.obj[1]);//1
// console.log(lRUCache.obj[2]);//0
// console.log(lRUCache.capacity);//0
// lRUCache.put(3, 3); // 该操作会使得关键字 2 作废，缓存是 {1=1, 3=3}
// console.log(lRUCache.get(2));// 返回 -1 (未找到)
// // {1=1, 3=3}
// lRUCache.put(4, 4); // 该操作会使得关键字 1 作废，缓存是 {4=4, 3=3}
// console.log(lRUCache.stack);

// console.log(lRUCache.get(1));// 返回 -1 (未找到)
// lRUCache.map.forEach((v, k) => {
//     console.log(`Key: ${k}, Value: ${v}`);
// });
// console.log(lRUCache.get(3));// 返回 3
// console.log(lRUCache.get(4));// 返回 4
